package br.com.lucasddaniel.inbuzios.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;

import android.content.Context;
import android.os.Environment;
import br.com.lucasddaniel.inbuzios.Controller;
import br.com.lucasddaniel.inbuzios.bean.PacoteArquivoBean;
import br.com.lucasddaniel.inbuzios.bean.PasseioBean;
import br.com.lucasddaniel.inbuzios.bean.TuristaBean;
import br.com.lucasddaniel.inbuzios.dao.ExcessaoBanco;
import br.com.lucasddaniel.inbuzios.dao.PasseioRepositorio;
import br.com.lucasddaniel.inbuzios.dao.TuristaRepositorio;

/**
 * Classe de acesso ao arquivo a ser importado e exportado.
 * 
 * @author ldsm
 * 
 */
public class ArquivoRepositorio {

    private static final String SEPARADOR = ";";
    private TuristaRepositorio turistaRepositorio;
    private PasseioRepositorio passeioRepositorio;
    SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yy HH:mm");
    
    public ArquivoRepositorio() {
        turistaRepositorio = new TuristaRepositorio();
        passeioRepositorio = new PasseioRepositorio();
    }

    /**
     * Importa os dados para o banco a partir da leitura do arquivo .txt.
     * 
     * @return true se tudo terminar corretamente.
     * @throws FileNotFoundException
     * @throws IOException
     * @throws ExcessaoBanco
     */
    public boolean importarDados(Context ctx) throws FileNotFoundException, IOException, ExcessaoBanco {
        boolean retorno = false;
        File file = new File(Environment.getExternalStorageDirectory() + "/inbuzios/turistas.txt");
        if (file.exists()) {
            turistaRepositorio.apagarDadosTuristasCadastrados(ctx);
            retorno = true;
            BufferedReader br = new BufferedReader(new FileReader(file));
            String linha;
            Calendar cal = Calendar.getInstance();
            while ((linha = br.readLine()) != null) {
                int posicao = 1;
                TuristaBean tb = new TuristaBean();
                String[] lin = linha.split(SEPARADOR);
                if (lin.length == 1) {
                    cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(lin[0].split(":")[0]));
                    cal.set(Calendar.MINUTE, Integer.valueOf(lin[0].split(":")[1]));
                    continue;
                } else {
                    tb.setHoraChegada(cal.getTimeInMillis());
                    tb.setNumRegistro(lin[posicao++]);
                    tb.setVooIn(lin[posicao++]);
                    tb.setPousada(lin[posicao++]);
                    tb.setNome(lin[posicao++]);
                    tb.setQuantidade(Integer.valueOf(lin[posicao++]));
                    tb.setDataSaida(lin[posicao++]);
                    tb.setVooOut(lin[posicao++]);
                    tb.setObservacao(lin[posicao++]);
                    tb.setMotorista(lin[posicao++]);
                    tb.setOperador(lin[posicao++]);
                }
                turistaRepositorio.inserir(tb, ctx);
            }
            br.close();
            file.delete();
        } else {
            throw new FileNotFoundException("O arquivo turistas.txt não foi encontrado ou o sdcard foi removido.");
        }

        return retorno;
    }

    public String exportarDadosTuristas(FileOutputStream out, Context ctx) throws IOException, ExcessaoBanco {
    	StringBuffer retorno = new StringBuffer();
    	for (TuristaBean turista : turistaRepositorio.listar(ctx)) {
    		if (turista.getObservacao() != null && !"".equalsIgnoreCase(turista.getObservacao())) {
	    		retorno.append(turista.getId() + ";");
	    		retorno.append(turista.getNumRegistro() + ";");
	    		retorno.append(turista.getNome() + ";");
	    		retorno.append(turista.getQuantidade() + ";");
	    		retorno.append(turista.getObservacao() + ";");
	    		Calendar cal = Calendar.getInstance();
	    		cal.setTimeInMillis(turista.getHoraChegada());
	    		retorno.append(cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ";");
	    		retorno.append(turista.getDataSaida() + ";");
	    		retorno.append(turista.getPousada() + ";");
	    		retorno.append(turista.getVooIn() + ";");
	    		retorno.append(turista.getVooOut() + ";");
	    		retorno.append(turista.getMotorista() + ";");
	    		retorno.append(turista.getOperador() + ";");
	    		retorno.append("\n");
    		}
    	}
    	if(Controller.isVersaoproducao()) {
    		turistaRepositorio.apagarDadosTuristasCadastrados(ctx);
    	}
    	return retorno.toString();
    }
    
    public String exportarDadosPasseios(FileOutputStream out, Context ctx) throws IOException, ExcessaoBanco {
    	String retorno = "";
        for (PasseioBean passeio : passeioRepositorio.listar(ctx)) {
        	retorno = retorno + montaArquivo(passeio, passeioRepositorio.buscarPacotes(passeio, ctx));
        	retorno = retorno + "\n";
//            out.write(montaArquivo(passeio, passeioRepositorio.buscarPacotes(passeio, ctx)));
//            out.write("\n".getBytes());
        }
//        out.close();
        if(Controller.isVersaoproducao()) {
        	passeioRepositorio.apagarDadosPasseiosVendidos(ctx);
        }
        return retorno;
    }

    private String montaArquivo(PasseioBean passeio, List<PacoteArquivoBean> pacs) {
        StringBuffer retorno = new StringBuffer();
        // retorno.append(tur.getHora()+";;;;;;;;;;");
//        retorno.append(pas.getId() + ";");
//        retorno.append(pas.getDataHoraVenda() + ";");
//        retorno.append(pas.getNomeGuia() + ";");
//        retorno.append(pas.getNomeTurista() + ";");
//        retorno.append(pas.getNomePousada() + ";");
//        retorno.append(pas.getTipoDeMoeda() + ";");
//        retorno.append(pas.getDesconto() + ";");
        retorno.append(passeio.getId() + ";");
        retorno.append(sdfData.format(passeio.getDataHoraVenda()) + ";");
        retorno.append(passeio.getNomeGuia() + ";");
        retorno.append(passeio.getNomeTurista() + ";");
        retorno.append(pacs.get(0).getQuantidade() + ";");
        retorno.append(";");
        retorno.append(";");
        retorno.append(pacs.get(0).getTipoMoeda() + ";");
        retorno.append((passeio.getTotalGeral() - passeio.getDesconto()) + ";");
        retorno.append(passeio.getSinal() + ";");
        retorno.append("DINHEIRO;");
        retorno.append(passeio.getSaldoFinal() + ";");
        
        //1=arraia| 2=rio 3=samba 4=barco 5=city 6=transfer
        boolean achou = false;
        for (PacoteArquivoBean pacote : pacs) {
            if ("Arraial do Cabo".equalsIgnoreCase(pacote.getNome())) {
            	retorno.append(sdfData.format(pacote.getDataHoraSaida()) + ";");
            	achou = true;
            } 
        }
        if (!achou) {
           	retorno.append(";");
        }
        
        achou = false;
        for (PacoteArquivoBean pacote : pacs) {
        	if ("Rio de janeiro".equalsIgnoreCase(pacote.getNome())) {
            	retorno.append(sdfData.format(pacote.getDataHoraSaida()) + ";");
            	achou = true;
            } 
        }
        if (!achou) {
           	retorno.append(";");
        }
        
        achou = false;
        for (PacoteArquivoBean pacote : pacs) {
        	if ("Noite de Samba".equalsIgnoreCase(pacote.getNome())) {
            	retorno.append(sdfData.format(pacote.getDataHoraSaida()) + ";");
            	achou = true;
            } 
        }
        if (!achou) {
           	retorno.append(";");
        }
        
        achou = false;
        for (PacoteArquivoBean pacote : pacs) {
        	if ("Passeio de Barco".equalsIgnoreCase(pacote.getNome())) {
            	retorno.append(sdfData.format(pacote.getDataHoraSaida()) + ";");
            	achou = true;
            } 
        }
        if (!achou) {
           	retorno.append(";");
        }
        
        achou = false;
        for (PacoteArquivoBean pacote : pacs) {
        	if ("City Tour Interno".equalsIgnoreCase(pacote.getNome())) {
            	retorno.append(sdfData.format(pacote.getDataHoraSaida()) + ";");
            	achou = true;
            } 
        }
        if (!achou) {
           	retorno.append(";");
        }
        
        retorno.append(passeio.getNomePousada() + ";");
        retorno.append(";");
        
        achou = false;
        for (PacoteArquivoBean pacote : pacs) {
        	if ("Transfer".equalsIgnoreCase(pacote.getNome())) {
            	retorno.append(sdfData.format(pacote.getDataHoraSaida()) + ";");
            	achou = true;
            } 
        }
        if (!achou) {
           	retorno.append(";");
        }
        retorno.append(passeio.getObs() + ";");
            
//            if ("Real".equalsIgnoreCase(pacote.getTipoMoeda())) {
//        		retorno.append(pacote.getPreco() + ";");
//        	} else {
//        		retorno.append(pacote.getPrecoDolar() + ";");
//        	}
//            retorno.append(pac.getNome() + ";");
//            retorno.append(pac.getTransporte() + ";");
//            retorno.append(pac.getTotal() + ";");

        return retorno.toString();
    }
}
